///*
// * (#)MyInvocationSecurityMetadataSource.java 1.0 2010-6-23  
// */
//
//package com.huaxingbankas.core.base.spring.security;
//
//import java.lang.reflect.Method;
//import java.util.ArrayList;
//import java.util.Collection;
//import java.util.HashMap;
//import java.util.Iterator;
//import java.util.List;
//import java.util.Map;
//
//import javax.annotation.Resource;
//
//import net.sf.ehcache.Cache;
//import net.sf.ehcache.Element;
//
//import org.apache.commons.lang.builder.ToStringBuilder;
//import org.apache.commons.logging.Log;
//import org.apache.commons.logging.LogFactory;
//import org.springframework.security.access.ConfigAttribute;
//import org.springframework.security.access.SecurityConfig;
//import org.springframework.security.access.method.AbstractMethodSecurityMetadataSource;
//import org.springframework.stereotype.Service;
//import org.springframework.util.AntPathMatcher;
//import org.springframework.util.PathMatcher;
//
////import com.hibernate.dao.WebUrlDAO;
////import com.hibernate.model.Role;
////import com.hibernate.model.WebUrl;
////import com.spring.init.InitSpring;
//
//
//@Service("myMethodSecurityMetadataSource")
//public class MyMethodSecurityMetadataSource extends AbstractMethodSecurityMetadataSource
//{
//	public static final String	ACEGI_EHCACHE	= "MethodAcegiEhcache";
//	
//	protected static final Log	logger		= LogFactory.getLog(MyMethodSecurityMetadataSource.class);
//	
//	private WebUrlDAO			webUrlDAO;
//
//	private Cache				ehCache;
//
//	private PathMatcher			pathMatcher	= new AntPathMatcher();
//
//	private static Map<String, Collection<ConfigAttribute>>	resourceMap	= new HashMap<String, Collection<ConfigAttribute>>();
//
//	public MyMethodSecurityMetadataSource()
//	{
//		
//	}
//
//	
//	/**
//	 * 浠�����涓�璋��������娉�������奖灏��缃�苟���瀛�
//	 */
//	private void loadResourceDefine()
//	{
//		Element element =this.ehCache.get(ACEGI_EHCACHE);
//
//		if (element != null)
//		{
//			logger.debug("find configattributedefinitionMap in cache!");
//			resourceMap= (Map<String, Collection<ConfigAttribute>>) element.getValue();
//			return;
//		}
//		
//		String url = null;
//		List<WebUrl> weburlList = this.webUrlDAO.findAll(); 
//		for (int i = 0; i < weburlList.size(); ++i)
//		{
//			url = ((WebUrl) weburlList.get(i)).getUrl().trim();
//			
//			List<Role> roles = ((WebUrl) weburlList.get(i)).getRoles();
//			Collection<ConfigAttribute> atts = new ArrayList<ConfigAttribute>();
//			for (Role r : roles)
//			{
//				if(resourceMap.containsKey(url))
//				{
//					atts=(Collection<ConfigAttribute>)resourceMap.get(url);
//				}
//					if(r!=null)
//						atts.add(new SecurityConfig(r.getRoleName()));
//			} 
//			resourceMap.put(url, atts);
//		}
//		Element elem = new Element(ACEGI_EHCACHE, resourceMap);
//		this.ehCache.put(elem);
//	}
//
//	@Resource
//	public void setWebUrlDAO(WebUrlDAO webUrlDAO)
//	{
//		this.webUrlDAO = webUrlDAO;
//	}
//
//	@Resource(name="ehCache")
//	public void setEhCache(Cache ehCache)
//	{
//		this.ehCache = ehCache;
//	}
//
//	public Collection<ConfigAttribute> getAttributes(Method m, Class<?> arg1)
//	{
//		 
//			loadResourceDefine();
//		// guess object is a URL.
//		String methodName=(m.getDeclaringClass().getName()+"."+m.getName());
//		String matchurl="";  //涓存���� 杩�����������绘��炬�����归�.
//		Collection<ConfigAttribute> ret=null;
//		if (resourceMap == null || resourceMap.size() == 0)
//			return null;
//		Iterator<String> iterator = resourceMap.keySet().iterator();
//		logger.debug("map.count="+resourceMap.size());
//		String key = null;
//		logger.debug("iterator ="+iterator.hasNext());
//		while (iterator.hasNext())
//		{
//			key = (String) iterator.next();
//			logger.debug("key = "+key +" methodName ="+methodName);
//			boolean matched = pathMatcher.match(key, methodName);
//			if (logger.isDebugEnabled())
//			{
//				if(matched)
//				logger.info("�归��板�涓�ethod锛�'" + methodName + "锛�ā寮�负 " + key + "锛������归�锛� + matched);
//			
//			}
//
//			if (matched && key.length()>=matchurl.length())
//			{
//				matchurl=key; 
//			}
//		}
//		if(resourceMap.containsKey(matchurl))
//		{
//			ret=(Collection<ConfigAttribute>) resourceMap.get(matchurl);
//		}
//		return ret;
//	}
//
//	public Collection<ConfigAttribute> getAllConfigAttributes()
//	{
//		return null;
//	}
//
//	public static void removeCache()
//	{
//		Cache cache=(Cache)InitSpring.getInstance("ehCache");
//		cache.remove(ACEGI_EHCACHE);
//		logger.info("acegic ���缃��瀛��娓��!!");
//	}
//
//}